﻿using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;
using System.Collections.Generic;
using SIARWS.Classes;
using System;

namespace SIARWS
{
    /// <summary>
    /// Descrição dos serviços do SIAR.
    /// </summary>
    [WebService(Namespace = "http://webservice.siar")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class ServicosSIAR : System.Web.Services.WebService
    {
        private DataClassesSIARDataContext db = new DataClassesSIARDataContext();

        /// <summary>
        /// Método responsável pelo cadastro de clientes.
        /// </summary>
        /// <param name="pessoa">Objeto Linq contendo os dados do cliente.</param>
        /// <param name="endereco">Objeto Linq contendo os dados do endereço do cliente.</param>
        [WebMethod]
        public void ClienteCadastrar(Pessoa pessoa, Endereco endereco)
        {
            int idTipoCliente = (from t in db.PessoaTipos where t.Tipo.ToString().Equals("Cliente") select t.ID).Single();
            pessoa.ID_Tipo = idTipoCliente;
            db.Pessoas.InsertOnSubmit(pessoa);
            db.SubmitChanges();
            Pessoa pes = (from f in db.Pessoas where f.ID == pessoa.ID select f).Single();
            endereco.ID_Cliente = pes.ID;
            db.Enderecos.InsertOnSubmit(endereco);
            db.SubmitChanges();
        }

        /// <summary>
        /// Método responsável pela atualização de clientes.
        /// </summary>
        /// <param name="pessoaBean">Bean com os dados do cliente.</param>
        /// <param name="enderecoBean">Bean com os dados do endereço do cliente.</param>
        [WebMethod]
        public void ClienteAtualizar(PessoaBean pessoaBean, EnderecoBean enderecoBean) 
        {
            Pessoa pessoa = (from p in db.Pessoas where p.Telefone.Equals(pessoaBean.Telefone) select p).Single();
            pessoa.Nome = pessoaBean.Nome;
            pessoa.Telefone = pessoaBean.Telefone;
            pessoa.CPF = pessoaBean.CPF;
            pessoa.Login = pessoaBean.Login;
            pessoa.Senha = pessoaBean.Senha;
            Endereco endereco = (from e in db.Enderecos where e.Telefone.Equals(pessoaBean.Telefone) select e).Single();
            endereco.Telefone = enderecoBean.Telefone;
            endereco.Rua = enderecoBean.Rua;
            endereco.Numero = enderecoBean.Numero;
            endereco.Bairro = enderecoBean.Bairro;
            endereco.Cidade = enderecoBean.Cidade;
            endereco.Complemento = enderecoBean.Complemento;
            db.SubmitChanges();
        }

        /// <summary>
        /// Método responsável pela deleção de clientes.
        /// </summary>
        /// <param name="telefone">String representando o telefone do cliente.</param>
        [WebMethod]
        public void ClienteDeletar(string telefone) 
        {
            Endereco endereco = (from e in db.Enderecos where e.Telefone.Equals(telefone) select e).Single();
            db.Enderecos.DeleteOnSubmit(endereco);
            db.SubmitChanges();
            Pessoa pessoa = (from p in db.Pessoas where p.Telefone.Equals(telefone) select p).Single();
            db.Pessoas.DeleteOnSubmit(pessoa);
            db.SubmitChanges();
        }

        /// <summary>
        /// Método responsável pela listagem de clientes.
        /// </summary>
        /// <returns>Um array de <code>PessoaBean</code>.</returns>
        [WebMethod]
        public PessoaBean[] ClienteListar()
        {
            int idTipoCliente = (from t in db.PessoaTipos where t.Tipo.ToString().Equals("Cliente") select t.ID).Single();
            IEnumerable<Pessoa> pessoas = from p in db.Pessoas where p.ID_Tipo == idTipoCliente select p;
            PessoaBean[] clientes = new PessoaBean[pessoas.Count()];
            int i = 0;
            foreach (Pessoa pessoa in pessoas)
            {
                PessoaBean cliente = new PessoaBean();
                cliente.Nome = pessoa.Nome;
                cliente.CPF = pessoa.CPF;
                cliente.Id = pessoa.ID;
                cliente.Id_Tipo = (int)pessoa.ID_Tipo;
                cliente.Login = pessoa.Login;
                cliente.Senha = pessoa.Senha;
                cliente.Telefone = pessoa.Telefone;
                clientes[i++] = cliente; 
            }
            return clientes;
        }

        /// <summary>
        /// Método responsável pela listagem de endereços.
        /// </summary>
        /// <returns>Um array de <code>EnderecoBean</code>.</returns>
        [WebMethod]
        public EnderecoBean[] enderecoListar()
        {
            IEnumerable<Endereco> enderecos = from f in db.Enderecos select f;
            EnderecoBean[] enderecosBeans = new EnderecoBean[enderecos.Count()];
            int i = 0;
            foreach (Endereco endereco in enderecos)
            {
                EnderecoBean enderecoBean = new EnderecoBean();
                enderecoBean.ID = endereco.ID;
                enderecoBean.ID_Cliente = (int)endereco.ID_Cliente;
                enderecoBean.Rua = endereco.Rua;
                enderecoBean.Telefone = endereco.Telefone;
                enderecoBean.Cidade = endereco.Cidade;
                enderecoBean.Complemento = endereco.Complemento;
                enderecoBean.Numero = (int)endereco.Numero;
                enderecoBean.Bairro = endereco.Bairro;
                enderecosBeans[i++] = enderecoBean;
            }
            return enderecosBeans;
        }

        [WebMethod]
        public EnderecoBean enderecoBuscar(int id)
        {
            Endereco end = (from f in db.Enderecos where f.ID_Cliente == id select f).Single();
            EnderecoBean enderecoBean = new EnderecoBean();
            enderecoBean.ID = end.ID;
            enderecoBean.ID_Cliente = (int)end.ID_Cliente;
            enderecoBean.Rua = end.Rua;
            enderecoBean.Telefone = end.Telefone;
            enderecoBean.Cidade = end.Cidade;
            enderecoBean.Complemento = end.Complemento;
            enderecoBean.Numero = (int)end.Numero;
            enderecoBean.Bairro = end.Bairro;
            return enderecoBean;
        }
        /// <summary>
        /// Método responsável pela busca de clientes.
        /// </summary>
        /// <param name="telefoneP">String representando o telefone do cliente buscado.</param>
        /// <returns>Um <code>PessoaBean</code> com os dados do cliente.</returns>
        [WebMethod]
        public PessoaBean ClienteBuscar(string telefoneP)
        {
            int idTipoCliente = (from t in db.PessoaTipos where t.Tipo.ToString().Equals("Cliente") select t.ID).Single();
            Pessoa pessoa = (from p in db.Pessoas where p.Telefone == telefoneP && p.ID_Tipo == idTipoCliente select p).Single();
            int id = pessoa.ID;
            string nome = pessoa.Nome;
            string cpf = pessoa.CPF;
            string telefone = pessoa.Telefone;
            string login = pessoa.Login;
            string senha = pessoa.Senha;
            PessoaBean pessoabean = new PessoaBean(id, nome, telefone, login, senha, cpf, idTipoCliente);
            return pessoabean;
        }

        /// <summary>
        /// Método responsável pelo cadastro de funcionários.
        /// </summary>
        /// <param name="pessoa">Objeto Linq com os dados do funcionário.</param>
        /// <param name="endereco">Objeto Linq com os dados do endereço do funcionário.</param>
        /// <param name="tipo">String com o nome do tipo de funcionário.</param>
        /// <returns><code>true</code>, se o funcionário for cadastrado com sucesso.
        ///          <code>false</code>, caso contrário.
        /// </returns>
        [WebMethod]
        public Boolean FuncionarioCadastrar(Pessoa pessoa, Endereco endereco, string tipo)
        {
            int IDTipoFuncionario = (from t in db.PessoaTipos where t.Tipo.Equals(tipo) select t.ID).Single();
            pessoa.ID_Tipo = IDTipoFuncionario;
            db.Pessoas.InsertOnSubmit(pessoa);
            db.SubmitChanges();
            pessoa = (from p in db.Pessoas where p.ID == pessoa.ID select p).Single();
            endereco.ID_Cliente = pessoa.ID;
            db.Enderecos.InsertOnSubmit(endereco);
            db.SubmitChanges();
            return true;
        }
    
        [WebMethod]
        public void FuncionarioAtualizar(Pessoa pessoaBean, Endereco enderecoBean)
        {
            Pessoa pessoa = (from f in db.Pessoas where f.Telefone.Equals(pessoaBean.Telefone) select f).Single();
            pessoa.Nome = pessoaBean.Nome;
            pessoa.Telefone = pessoaBean.Telefone;
            pessoa.CPF = pessoaBean.CPF;
            pessoa.Login = pessoaBean.Login;
            pessoa.Senha = pessoaBean.Senha;

            Endereco endereco = (from f in db.Enderecos where f.Telefone.Equals(enderecoBean.Telefone) select f).Single();
            endereco.Telefone = enderecoBean.Telefone;
            endereco.Rua = enderecoBean.Rua;
            endereco.Numero = enderecoBean.Numero;
            endereco.Bairro = enderecoBean.Bairro;
            endereco.Cidade = enderecoBean.Cidade;
            endereco.Complemento = enderecoBean.Complemento;
            db.SubmitChanges();           
        }

        [WebMethod]
        public void FuncionarioDeletar(string telefone) 
        {
            Endereco endereco = (from e in db.Enderecos where e.Telefone.Equals(telefone) select e).Single();
            db.Enderecos.DeleteOnSubmit(endereco);
            db.SubmitChanges();
            Pessoa pessoa = (from p in db.Pessoas where p.Telefone.Equals(telefone) select p).Single();
            db.Pessoas.DeleteOnSubmit(pessoa);
            db.SubmitChanges();
        }

        /// <summary>
        /// pessoa tipo 1 : Admin
        /// pessoa tipo 2 : Garçom
        /// pessoa tipo 3 : Motoqueiro
        /// pessoa tipo 4 : ...
        /// pessoa tipo 5 : Cliente
        /// </summary>
        /// <returns></returns>
        [WebMethod]
        public PessoaBean[] FuncionarioListar()
        {
            int id = 0;
            IEnumerable<PessoaTipo> pest = from f in db.PessoaTipos select f;
            foreach (PessoaTipo t in pest)
            {
                if (t.Tipo.Equals("Cliente"))
                {
                    id = t.ID;
                }
            }
            IEnumerable<Pessoa> pes = from f in db.Pessoas where f.ID_Tipo != id select f;
            PessoaBean[] listaFuncionarios = new PessoaBean[pes.Count()];
            int i = 0;
            foreach (Pessoa p in pes)
            {  
                PessoaBean pessoabean = new PessoaBean(p.ID, p.Nome, p.Telefone, p.Login, p.Senha, p.CPF, (int)p.ID_Tipo);
                listaFuncionarios[i++] = pessoabean; 
            }
            return listaFuncionarios.ToArray();
        }


        [WebMethod]
        public void InsumoCadastrar(Insumo insumo)
        {
            db.Insumos.InsertOnSubmit(insumo);
            db.SubmitChanges();
        }

        [WebMethod]
        public InsumoBean InsumoBuscar(int id)
        {
            Insumo insumo = (from i in db.Insumos where i.ID == id select i).Single();
            InsumoBean insumobean = new InsumoBean();
            insumobean.ID = insumo.ID;
            insumobean.Nome = insumo.Nome;
            insumobean.QuantidadeEstoque = (double) insumo.QuantidadeEstoque;
            insumobean.Unidade = insumo.Unidade;
            return insumobean;
        }

        [WebMethod]
        public void InsumoAtualizar(InsumoBean aInsumo)
        {
            Insumo ins = (from f in db.Insumos where f.ID == aInsumo.ID select f).Single();
            ins.Nome = aInsumo.Nome;
            ins.QuantidadeEstoque = ins.QuantidadeEstoque + aInsumo.QuantidadeEstoque;
            ins.Unidade = aInsumo.Unidade;
            db.SubmitChanges();
        }

        [WebMethod]
        public void InsumoDeletar(int id) 
        {
            Insumo ins = (from f in db.Insumos where f.ID == id select f).Single();
            db.Insumos.DeleteOnSubmit(ins);
            db.SubmitChanges();
        }
         
        [WebMethod]
        public InsumoBean[] InsumoListar()
        {
            IEnumerable<Insumo> ins = from f in db.Insumos select f;
            InsumoBean[] listaDeInsumos = new InsumoBean[ins.Count()];
            int i = 0;
            foreach (Insumo l in ins)
            {
                    InsumoBean novoInsumo = new InsumoBean(l.ID, l.Nome, (double)l.QuantidadeEstoque, l.Unidade);
                    listaDeInsumos[i++] = novoInsumo;
            }
            return listaDeInsumos.ToArray();
        }

        [WebMethod]
        public void PratoCadastrar(Prato prato, Prato_Insumo[] insumos)
        {
            db.Pratos.InsertOnSubmit(prato);
            db.SubmitChanges();
            Prato prato1 = (from p in db.Pratos where p.ID == prato.ID select p).Single();
            foreach (Prato_Insumo pi in insumos)
            {
                pi.ID_Prato = prato1.ID;
            }
            db.Prato_Insumos.InsertAllOnSubmit(insumos);
            db.SubmitChanges();
        }

        [WebMethod]
        public int PratoInsumoCadastrar(Prato_Insumo pratoInsumo)
        {
            db.Prato_Insumos.InsertOnSubmit(pratoInsumo);
            db.SubmitChanges();
            Prato_Insumo pinsumo = (from p in db.Prato_Insumos where p.ID == pratoInsumo.ID select p).Single();
            return pinsumo.ID;
        }
        [WebMethod]
        public void PratoAtualizar(Prato prato)
        {
            Prato prato1 = (from p in db.Pratos where p.ID == prato.ID select p).Single();
            prato1.Nome = prato.Nome;
            prato1.Preco = prato.Preco;
            prato1.Descricao = prato.Descricao;
            db.SubmitChanges();
        }

        [WebMethod]
        public PratoBean PratoBuscar(int id)
        {
            Prato prato = (from p in db.Pratos where p.ID == id select p).Single();
            PratoBean pratobean = new PratoBean();
            pratobean.Id = prato.ID;
            pratobean.Nome = prato.Nome;
            pratobean.Preco = (double) prato.Preco;
            pratobean.Descricao = prato.Descricao;
            pratobean.Tipo = prato.Tipo;
            return pratobean;
        }

        [WebMethod]
        public PratoInsumoBean[] PratoInsumoBuscar(int idPrato)
        {
            IEnumerable<Prato_Insumo> insumos = from i in db.Prato_Insumos where i.ID_Prato == idPrato select i;
            PratoInsumoBean[] bean = new PratoInsumoBean[insumos.Count()];
            int cont=0;
            foreach (Prato_Insumo pi in insumos)
            {
                PratoInsumoBean p = new PratoInsumoBean((int) pi.ID, (int)pi.ID_Prato, (int)pi.ID_Insumo, (double)pi.Quantidade);
                bean[cont++] = p;
            }
            return bean;
        }

        [WebMethod]
        public void PratoInsumoDeletar(int id)
        {
            Prato_Insumo pra = (from f in db.Prato_Insumos where f.ID == id select f).Single();
            db.Prato_Insumos.DeleteOnSubmit(pra);
            db.SubmitChanges();
        }

        [WebMethod]
        public PratoBean[] PratoListar()
        {
            IEnumerable<Prato> pra = from f in db.Pratos select f;
            List<PratoBean> listaPratos = new List<PratoBean>();
            foreach (Prato prato in pra)
            {
                int id = prato.ID;
                string nome = prato.Nome;
                string descricao = prato.Descricao;
                double preco = (double) prato.Preco;
                string tipo = prato.Tipo;
                string tamanho = prato.Tamanho;

                PratoBean pratobean = new PratoBean(id, nome, descricao, preco, tipo, tamanho);
                listaPratos.Add(pratobean);
            }
            return listaPratos.ToArray();
        }

        [WebMethod] 
        public void PratoDeletar(int id)
        {
            Prato pra = (from f in db.Pratos where f.ID == id select f).Single();
            db.Pratos.DeleteOnSubmit(pra);
            db.SubmitChanges();
        }

        [WebMethod]
        public void BebidaCadastrar(Bebida bebida) 
        {
            db.Bebidas.InsertOnSubmit(bebida);
            db.SubmitChanges();
        }

        [WebMethod]
        public void BebidaAtualizar(BebidaBean bebida)
        {
            Bebida beb = (from f in db.Bebidas where f.ID == bebida.Id select f).Single();
            beb.Nome = bebida.Nome;
            beb.QuantidadeEstoque = beb.QuantidadeEstoque + bebida.QtdEstoque;
            beb.Tipo = bebida.Tipo;
            beb.Preco = (decimal)bebida.Preco;
            db.SubmitChanges();
        }

        [WebMethod]
        public BebidaBean BebidaBuscar(int id)
        {
            Bebida beb = (from f in db.Bebidas where f.ID == id select f).Single();
            BebidaBean bebidabean = new BebidaBean();
            bebidabean.Id = beb.ID;
            bebidabean.Nome = beb.Nome;
            bebidabean.Preco = (double) beb.Preco;
            bebidabean.QtdEstoque = (int) beb.QuantidadeEstoque;
            bebidabean.Tipo = beb.Tipo;
            return bebidabean;

        }

        [WebMethod]
        public BebidaBean[] BebidaListar()
        {
            IEnumerable<Bebida> beb = from f in db.Bebidas select f;
            BebidaBean[] listaBebidas = new BebidaBean[beb.Count()];
            int i = 0;
            foreach (Bebida bebida in beb)
            {
                BebidaBean b = new BebidaBean(bebida.ID, bebida.Nome, 
                    bebida.Tipo, (double)bebida.Preco, 
                    (int)bebida.QuantidadeEstoque);
                listaBebidas[i++] = b;
            }
            return listaBebidas.ToArray();
        }

        [WebMethod]
        public void BebidaDeletar(int id)
        {
            Bebida beb = (from f in db.Bebidas where f.ID == id select f).Single();
            db.Bebidas.DeleteOnSubmit(beb);
            db.SubmitChanges();
        }

        [WebMethod]
        public PessoaBean EfetuarLoginWeb(String login, String senha)
        {
            //int idTipoCliente = (from t in db.PessoaTipos where t.Tipo.ToString().Equals("Cliente") select t.ID).Single();
            /*&& c.ID_Tipo == idTipoCliente*/ 
            Pessoa cliente = (from c in db.Pessoas where c.Login == login select c).Single();
            if (cliente != null && cliente.Senha == senha)
            {
                PessoaBean pessoaB = new PessoaBean();
                pessoaB.Id = cliente.ID;
                pessoaB.Id_Tipo = (int)cliente.ID_Tipo;
                pessoaB.Login = cliente.Login;
                pessoaB.Nome = cliente.Nome;
                pessoaB.Senha = cliente.Senha;
                pessoaB.Telefone = cliente.Telefone;
                pessoaB.CPF = cliente.CPF;
                return pessoaB;
            }
            else
                return null;
        }

        [WebMethod]
        public PessoaTipoBean[] TipoListar()
        {
            IEnumerable<PessoaTipo> nTipo = from f in db.PessoaTipos select f;
            PessoaTipoBean[] listarTipo = new PessoaTipoBean[nTipo.Count()];
            int i = 0;
            foreach (PessoaTipo tipo in nTipo)
            {
                PessoaTipoBean p = new PessoaTipoBean(tipo.ID, tipo.Tipo);                    
                listarTipo[i++] = p;
            }
            return listarTipo.ToArray();
        }

        [WebMethod]
        public void PedidoCadastrar(Pedido pedido)
        {
            db.Pedidos.InsertOnSubmit(pedido);
            db.SubmitChanges();
        } 

        [WebMethod]
        public PedidoBean[] PedidoListar()
        {
            IEnumerable<Pedido> pedidos = from p in db.Pedidos select p;
            PedidoBean[] listaPedidos = new PedidoBean[pedidos.Count()];
            int cont = 0;
            foreach (Pedido p in pedidos)
            {
                int idMesa = 0;
                int idBebida = 0;
                int idPrato = 0;
                int idCliente = 0;
                PedidoBean pedidoBean = null;
                if (p.Num_Mesa != null)
                {
                    idMesa = (int)p.Num_Mesa;
                }
                if (p.ID_Bebida != null)
                {
                    idBebida = (int)p.ID_Bebida;
                }
                if (p.ID_Prato != null)
                {
                    idPrato = (int)p.ID_Prato;
                }
                if (p.ID_Cliente != null)
                {
                    idCliente = (int)p.ID_Cliente;
                }
                bool ok = true;
                if (p.Num_Mesa == null)
                {
                    pedidoBean = new PedidoBean(p.ID, idCliente, idMesa,
                       idBebida, idPrato, 1, p.Status, ok);
                }
                else if (p.ID_Cliente==null){
                   pedidoBean = new PedidoBean(p.ID, idMesa, idMesa,
                   idBebida, idPrato, 1, p.Status);
                }
                listaPedidos[cont++] = pedidoBean;
            }
            return listaPedidos;
        }

        [WebMethod]
        public PratoBean RecuperarPrato(int id_prato)
        {
            Prato prato = (from f in db.Pratos where f.ID == id_prato select f).Single();
            PratoBean pratoBean = new PratoBean();
            pratoBean.Id = prato.ID;
            pratoBean.Nome = prato.Nome;
            pratoBean.Preco = (double)prato.Preco;
            pratoBean.Tipo = prato.Tipo;
            pratoBean.Descricao = prato.Descricao;
            return pratoBean;
        }

        [WebMethod]
        public string PratoRecuperarDescricao(int id)
        {
            Prato prato = (from f in db.Pratos where f.ID == id select f).Single();
            return prato.Nome;
        }

        [WebMethod]
        public string BebidaRecuperarDescricao(int id) 
        {
            Bebida bebida = (from f in db.Bebidas where f.ID == id select f).Single();
            return bebida.Nome;
        }

        [WebMethod]
        public string ClienteRecuperarNome(int id) 
        {
            Pessoa pessoa = (from f in db.Pessoas where f.ID == id select f).Single();
            return pessoa.Nome;
        }

        [WebMethod]
        public string ClienteRecuperarTelefone(int id)
        {
            Pessoa pessoa = (from f in db.Pessoas where f.ID == id select f).Single();
            return pessoa.Telefone;
        }

        [WebMethod]
        public void VendaCadastrar(Venda venda)
        {
            db.Vendas.InsertOnSubmit(venda);
            db.SubmitChanges();
        }

        [WebMethod]
        public void VendaEncerrar(Venda v)
        {
            Venda venda = (from p in db.Vendas where p.ID == v.ID select p).Single();
            venda.HoraF = System.DateTime.Now;
            v.Estado = "Fechado";
            db.SubmitChanges();
        }

        [WebMethod]
        public string RecuperarFuncionario(int id_func)
        {
            Pessoa pessoa = (from f in db.Pessoas where f.ID == id_func select f).Single();
            return pessoa.Nome;
        }
        
        [WebMethod]
        public PedidoBean[] PedidosListarPorCliente(int idCliente)
        {
            IEnumerable<Pedido> pedidos = from p in db.Pedidos where p.ID_Cliente == idCliente select p;
            PedidoBean[] listaPedidos = new PedidoBean[pedidos.Count()];
            int cont = 0;
            foreach (Pedido p in pedidos)
            {
                int idMesa = 0;
                int idBebida = 0;
                int idPrato = 0;
                if (p.Num_Mesa != null)
                {
                    idMesa = (int)p.Num_Mesa;
                }
                if (p.ID_Bebida != null)
                {
                    idBebida = (int)p.ID_Bebida;
                }
                if (p.ID_Prato != null)
                {
                    idPrato = (int)p.ID_Prato;
                }
                PedidoBean pedidoBean = new PedidoBean(p.ID, (int)p.ID_Func, idCliente, idMesa,
                   idBebida, idPrato, 1, p.Status);
                listaPedidos[cont++] = pedidoBean;
            }
            return listaPedidos;
        }

        /// <summary>
        /// Método retorna os pedidos salão
        /// O objetivo é listar no PDA.
        /// </summary>
        /// <returns></returns>
        [WebMethod]
        public PedidoBean[] PedidosMesaListar()
        {
            IEnumerable<Pedido> pedidos = from p in db.Pedidos where p.Num_Mesa != null select p;
            PedidoBean[] listaPedidos = new PedidoBean[pedidos.Count()];
            int cont = 0;
            foreach (Pedido p in pedidos)
            {
                int idMesa = 0;
                int idBebida = 0;
                int idPrato = 0;
                int idCliente = 0;
                
                idMesa = (int)p.Num_Mesa;
                if (p.ID_Bebida != null)
                {
                    idBebida = (int)p.ID_Bebida;
                }
                if (p.ID_Prato != null)
                {
                    idPrato = (int)p.ID_Prato;
                }
                PedidoBean pedidoBean = new PedidoBean(p.ID, (int)p.ID_Func, idCliente, idMesa,
                   idBebida, idPrato, 1, p.Status);
                listaPedidos[cont++] = pedidoBean;
            }
            return listaPedidos;
        }

        [WebMethod]
        public void PedidoAtualizar(int id, string status) 
        {
            Pedido pedido = (from f in db.Pedidos where f.ID == id select f).Single();
            pedido.Status = status;
            db.SubmitChanges();
        }

        [WebMethod]
        public void PedidoDeletar(int id) 
        {
            Pedido pedido = (from f in db.Pedidos where f.ID == id select f).Single();
            db.Pedidos.DeleteOnSubmit(pedido);
            db.SubmitChanges();
        }

        [WebMethod]
        public VendaBean[] VendaListar()
        {
            IEnumerable<Venda> venda = from f in db.Vendas select f;
            VendaBean[] listarVendas = new VendaBean[venda.Count()];
            int i = 0;
            foreach (Venda v in venda)
            {
                VendaBean vendaBean = null;
                if (v.ID_Cliente == null)
                {
                    bool teste = true;
                    vendaBean = new VendaBean(v.ID,(int)v.Num_Mesa,(DateTime)v.HoraA, v.Estado,teste);
                }
                else if (v.Num_Mesa == null) {

                    vendaBean = new VendaBean(v.ID, (int)v.ID_Cliente, (DateTime)v.HoraA, v.Estado);
                }
                if (v.Entregador != null)
                {
                    vendaBean.Entregador = (int)v.Entregador;
                }
                listarVendas[i++] = vendaBean;
            }
            return listarVendas.ToArray();
        }

        [WebMethod]
        public VendaBean VendaBuscarPorCliente(int idCliente)
        {
            Venda venda = (from p in db.Vendas where p.ID_Cliente == idCliente select p).Single();
            int numMesa = 0;
            if (venda.Num_Mesa != null)
            {
                numMesa = (int)venda.Num_Mesa;
            }
            VendaBean vendaBean = new VendaBean((int)venda.ID, (int)venda.ID_Cliente, numMesa, (DateTime)venda.HoraA, (DateTime)venda.HoraF, venda.Estado);
            return vendaBean;
        }

        [WebMethod]
        public VendaBean VendaBuscarPorMesa(int idMesa)
        {
            Venda venda = (from p in db.Vendas where p.Num_Mesa == idMesa select p).Single();
            int numMesa = 0;
            if (venda.Num_Mesa != null)
            {
                numMesa = (int)venda.Num_Mesa;
            }
            VendaBean vendaBean = new VendaBean((int)venda.ID, 0, numMesa, (DateTime)venda.HoraA, (DateTime)venda.HoraF, venda.Estado);
            return vendaBean;
        }

        [WebMethod]
        public PratoBean[] PratosListarDaVendaAtual(int cliente_id)
        {
            IEnumerable<Pedido> pedidos = from p in db.Pedidos where p.ID_Cliente == cliente_id select p;
            PratoBean[] listaPratos = new PratoBean[pedidos.Count()];
            int cont = 0;
            int idPrato;
            foreach (Pedido p in pedidos)
            {
                if (p.ID_Prato != null)
                {
                    idPrato = (int)p.ID_Prato;
                    listaPratos[cont++] = (this.RecuperarPrato(idPrato));
                }
            }
            return listaPratos;

        }

        [WebMethod]
        public BebidaBean[] BebidasListarDaVendaAtual(int cliente_id)
        {
            IEnumerable<Pedido> pedidos = from p in db.Pedidos where p.ID_Cliente == cliente_id select p;
            BebidaBean[] listaBebidas = new BebidaBean[pedidos.Count()];
            int cont = 0;
            int idBebida;
            foreach (Pedido p in pedidos)
            {
                if (p.ID_Bebida != null)
                {
                    idBebida= (int)p.ID_Bebida;
                    listaBebidas[cont++] = (this.BebidaBuscar(idBebida));
                }
            }
            return listaBebidas;
        }

        [WebMethod]
        public String hello()
        {
            return "Funfou!";
        }

        [WebMethod]
        public void CaixaAbrir(Financeiro fin)
        {
            db.Financeiros.InsertOnSubmit(fin);
            db.SubmitChanges();
        }

        [WebMethod]
        public FinanceiroBean CaixaRecuperar()
        {
            IEnumerable<Financeiro> fin = from f in db.Financeiros select f;
            int i = fin.Count()-1;
            FinanceiroBean bean = new FinanceiroBean();
            bean.Abertura = (decimal) fin.ElementAt(i).Abertura;
            bean.DataAbertura = fin.ElementAt(i).DataAbertura;
            bean.Estado = true;
            bean.Fechamento = (decimal)fin.ElementAt(i).Abertura;
            bean.TotalVendas = 0;
            return bean;
        }

        [WebMethod]
        public void CaixaFechar(Financeiro fin)
        {
            IEnumerable<Financeiro> c = from f in db.Financeiros where f.DataAbertura == f.DataAbertura select f;
            int i = c.Count() - 1;
            Financeiro caixa = c.ElementAt(i);
            caixa.Estado = false;
            decimal vendas = 0;
            var valorVendasBebida = from b in db.Bebidas
                                    join hv in db.HistoricoVendas
                                        on b.ID equals hv.ID_Bebida
                                    select new { b.Preco, hv.Qtd };
            var valorVendasPrato = from p in db.Pratos
                                   join hv in db.HistoricoVendas
                                        on p.ID equals hv.ID_Prato
                                   select new { p.Preco, hv.Qtd };
            if (valorVendasBebida.Count() != 0)
            {

                foreach (var beb in valorVendasBebida)
                {
                    vendas += (decimal)beb.Preco * (decimal)beb.Qtd;
                }
            }
            if (valorVendasPrato.Count() != 0)
            {
                foreach (var pra in valorVendasPrato)
                {
                    vendas += (decimal)pra.Preco * (decimal)pra.Qtd;
                }
            }
            caixa.TotalVendas = vendas;
            caixa.Fechamento = caixa.Abertura + vendas;
            db.SubmitChanges();
        }
        [WebMethod]
        public VendaBean VendaBuscar(int id)
        {
            Venda v = (from venda in db.Vendas where venda.ID == id select venda).Single();
            VendaBean vendaBean = null;
                if (v.ID_Cliente == null)
                {
                    bool teste = true;
                    vendaBean = new VendaBean(v.ID,(int)v.Num_Mesa,(DateTime)v.HoraA, v.Estado,teste);
                }
                else if (v.Num_Mesa == null) {

                    vendaBean = new VendaBean(v.ID, (int)v.ID_Cliente, (DateTime)v.HoraA, v.Estado);
                }
                if (v.Entregador != null)
                {
                    vendaBean.Entregador = (int)v.Entregador;
                }
            return vendaBean;
        }

        [WebMethod]
        public void VendaAtualizar(Venda venda)
        {
            Venda vend = (from v in db.Vendas where v.ID == venda.ID select v).Single();
            vend.Entregador = venda.Entregador;
            vend.Estado = venda.Estado;
            vend.HoraA = venda.HoraA;
            vend.HoraF = venda.HoraF;
            vend.ID_Cliente = venda.ID_Cliente;
            vend.Num_Mesa = venda.Num_Mesa;
            db.SubmitChanges();
        }
    }


}
